Rem
chatbefehle - chat commands, part of mscchat

Copyright (c) 2009 Michael Schaefer and Immo-Gert Birn

This program is free software: you can redistribute it And/Or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, Or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY Or FITNESS For A PARTICULAR PURPOSE.  See the
GNU General Public License For more details.

You should have received a copy of the GNU General Public License
along with this program.  If Not, see <http://www.gnu.org/licenses/>.
EndRem


'==============================================================================
' Basisklasse fuer Befehle, jeder konkrete Befehl muss
' davon ableiten
'==============================================================================
Type TBefehl Abstract
  Field menu_text:String           ' der im Menu angezeigte Text
  Field menu_id:Int                ' der Identifier
  Field is_global_menu:Int = False ' soll der Befehl im globalen Menu erscheinen
  Field is_popup_menu:Int  = False ' soll der Befehl im Popup-Menu erscheinen
  Field ab_rang:Int        = c_rang_admin ' ab welchem Benutzerrang ist der Befehl verfügbar
  Field bestaetigungs_msg:String = Null  ' Bestätigungspopup vor Befehlsausführung senden
  Field befehl:String      = Null  ' der zu sendende Netzwerkbefehl
  Field is_popup_benutzerspezifisch:Int = False ' bei Befehlsausführung via Popup-Menu nur für Benutzer ausführen

  Field popup_menu_entry:tgadget = Null  ' Referenz auf das Menu

  ' was soll der Client tun?
  Method doit(t:TChatClientGUI)                    
    ' leer, muss von Befehlen implementiert werden
  EndMethod

  ' was soll auf dem lokalen Client getan werden
  Method doit_local(t:TChatClientGUI)              
    ' leer, muss von Befehlen implementiert werden
  EndMethod

  ' fuer benutzerspez. Popup-Menus
  Method activate_popup_menu_entry(selected_user:String)
    If Not is_popup_benutzerspezifisch Then Return
    If Not popup_menu_entry Then Return
    If selected_user Then
      EnableMenu(popup_menu_entry)
    Else
      DisableMenu(popup_menu_entry)
    EndIf
  EndMethod

EndType

'==============================================================================
' Chat-Server stoppen, ist im Server-Quelltext implementiert
'==============================================================================
Type TBefehlServerBeenden Extends TBefehl
  Method Create:TBefehlServerBeenden()
    Self.menu_text          = "Server beenden"
    Self.is_global_menu     = True
    Self.bestaetigungs_msg  = "Server wirklich beenden?"
    Self.befehl             = c_befehl_stopserver
    Return Self
  EndMethod 
EndType

'==============================================================================
' Alle Chat-Clients beenden
'==============================================================================
Type TBefehlClientsBeenden Extends TBefehl
  Method Create:TBefehlClientsBeenden()
    Self.menu_text          = "Alle Clients beenden"
    Self.is_global_menu     = True
    Self.bestaetigungs_msg  = "Alle Clients wirklich beenden?"
    Self.befehl             = c_befehl_beendeclients
    Return Self
  EndMethod

  Method doit(t:TChatClientGUI)
    End
  EndMethod
EndType

'==============================================================================
' Alle PCs herunterfahren (nur Windows)
'==============================================================================
Type TBefehlPCsBeenden Extends TBefehl
  Method Create:TBefehlPCsBeenden()
    Self.menu_text          = "Alle PCs herunterfahren"
    Self.is_global_menu     = True
    Self.bestaetigungs_msg  = "Alle PC`s wirklich herunterfahren?"
    Self.befehl             = c_befehl_shutdownpcs
    Return Self
  EndMethod

  Method doit(t:TChatClientGUI)
    Local proc:TProcess=TProcess.Create("shutdown -s -f", 0)
    proc=TProcess.Create("halt", 0)
  EndMethod
EndType

'==============================================================================
' PC-Herunterfahren beenden (nur Windows)
'==============================================================================
Type TBefehlPCsBeendenAbbrechen Extends TBefehl
  Method Create:TBefehlPCsBeendenAbbrechen()
    Self.menu_text          = "Alle PCs herunterfahren abbrechen"
    Self.is_global_menu     = True
    Self.bestaetigungs_msg  = "Herunterfahren der PCs abbrechen?"
    Self.befehl             = c_befehl_shutdownpcsAbbrechen
    Return Self
  EndMethod

  Method doit(t:TChatClientGUI)
    Local proc:TProcess=TProcess.Create("shutdown -a", 0)
  EndMethod
EndType

'==============================================================================
' Benutzer rausschmeissen
'==============================================================================
Type TBefehlKickUser Extends TBefehl
  Method Create:TBefehlKickUser()
    Self.menu_text          = "Kick"
    Self.is_global_menu     = False
    Self.is_popup_menu      = True
    Self.bestaetigungs_msg  = "Benutzer kicken?"
    Self.befehl             = c_befehl_kickuser
    Self.is_popup_benutzerspezifisch = True
    Self.ab_rang            = c_rang_moderator
    Return Self
  EndMethod

  Method doit(t:TChatClientGUI)
    If t.userdata.rang = c_rang_admin Then Return
    t.abmelden("Rausgekickt!")
  EndMethod
EndType

'==============================================================================
' Benutzer rausschmeissen
'==============================================================================
Type TBefehlRefreshUsers Extends TBefehl
  Method Create:TBefehlRefreshUsers()
    Self.menu_text          = "Benutzerliste aktualisieren"
    Self.is_global_menu     = True
    Self.is_popup_menu      = True
    Self.ab_rang            = c_rang_gast
    Return Self
  EndMethod

  Method doit_local(t:TChatClientGUI)
    t.getUsers()
  EndMethod
EndType

'==============================================================================

Global befehle:TBefehl[100]
Global nr_befehle:Int

Local  i:Int = 0
Local b:TBefehl = New TBefehlServerBeenden.Create()
befehle[i] = b

i = i + 1
b = New TBefehlClientsBeenden.Create()
befehle[i] = b

?Win32
i = i + 1
b = New TBefehlPCsBeenden.Create()
befehle[i] = b

i = i + 1
b = New TBefehlPCsBeendenAbbrechen.Create()
befehle[i] = b
?  ' Ende Win32

i = i + 1
b = New TBefehlKickUser.Create()
befehle[i] = b

i = i + 1
b = New TBefehlRefreshUsers.Create()
befehle[i] = b


'---------------------------------------------------------------------------------
nr_befehle = i + 1

' setze die Menu-Id; muss lediglich eindeutig sein, ausserdem sagt unsere
' Konvention dass sie groesser gleich 10000 sein soll (siehe chatconstanten.bmx)
For i = 0 To nr_befehle - 1
  befehle[i].menu_id = c_befehle_offset + i
Next